﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using iTextSharp.text;
using iTextSharp.text.pdf;
using YunSpace.Core.Pdf.Params;

namespace YunSpace.Core.Pdf
{
    /// <summary>
    /// PDF 模板
    /// </summary>
    public class PdfYSTemplate
    {
        #region private fields

        private readonly PdfProvider _pdfProvider;
        private readonly string _imgPrefix;

        #endregion private fields

        #region ctor

        public PdfYSTemplate(string toSaveFileName = null, string imgPrefix = "")
        {
            _pdfProvider = new PdfProvider(toSaveFileName ?? $"Pdf/{DateTime.Now:yyyyMMdd_hhmmss}.pdf", 500, 300);
            _imgPrefix = imgPrefix;
        }

        #endregion ctor

        #region 创建第一页

        public void CreatePageFor1()
        {
            var pdfProvider = CreateTemplate("上海场地方案");

            //右边栏
            _pdfProvider.Draw(_imgPrefix + "1/rightBar.png", 400, 25, 100, 275);

            var titles = new string[] { "船台", "船厂", "西岸艺术中心", "中成智谷秀场" };
            var locationDescriptions = new string[] { "上海市黄浦区南京西路399号（近黄陂北路口）", "上海市普陀区大渡河路158号（近光复西路）", "上海市长宁区长宁路1018号（近汇川路）", "上海市浦东新区新金桥路1599号" };
            var siteTypes = new string[] { "秀场展馆", "秀场展馆", "艺术画廊", "艺术画廊" };

            var table = pdfProvider.CreateTable(60);

            for (var i = 0; i < 4; i++)
            {
                table.AddCell(_pdfProvider.CreateImgCell(_imgPrefix + "1/t1.png", 10));
                table.AddCell(_pdfProvider.CreateEmptyCell());

                var innerTable = new PdfPTable(1);
                innerTable.AddCell(_pdfProvider.CreateCell(titles[i], 1, 1, 5, Element.ALIGN_LEFT, 10, 0));
                innerTable.AddCell(_pdfProvider.CreateBlankSpaceCell(1, 1, 3));
                innerTable.AddCell(_pdfProvider.CreateCell(locationDescriptions[i], 1, 1, 5, Element.ALIGN_LEFT, 7, 0, new RgbParam(0, 255, 0)));

                innerTable.AddCell(_pdfProvider.CreateCell(siteTypes[i], 1, 1, 5, Element.ALIGN_LEFT, 7, 0, new RgbParam(255, 0, 0)));
                table.AddCell(new PdfPCell(innerTable) { Colspan = 30, Border = 0 });

                table.AddCell(_pdfProvider.CreateEmptyCell(19));

                if (i != 3)
                {
                    table.AddCell(_pdfProvider.CreateBlankSpaceCell(60, 1, 2));
                }
            }

            pdfProvider.AddToDocument(table);

            for (var i = 1; i <= 4; i++)
            {
                //按顺序覆盖
                _pdfProvider.DrawContent(i.ToString(), 10, 255, 0, 0, 26, 255 - (56 * (i - 1)));
            }
        }

        #endregion 创建第一页

        #region 创建第二页

        /// <summary>
        /// 创建第二页
        /// </summary>
        public void CreatePageFor2()
        {
            var pdfProvider = CreateTemplate("TMG艺术中心");

            //创建三列两行表格，固定宽度，6个单元格
            var table = pdfProvider.CreateTable(62);
            const int defaultColspan = 20;

            //第一行图片
            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "2/t1.png", defaultColspan));
            table.AddCell(pdfProvider.CreateEmptyCell());

            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "2/t2.png", defaultColspan));
            table.AddCell(pdfProvider.CreateEmptyCell());

            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "2/t3.png", defaultColspan));

            //第二行文字
            //列要填充完全（如设置 50 列就需要将 50 列填充完整），不然不显示
            const int defaultHorizontalAlignment = Element.ALIGN_LEFT;
            const int defaultVerticalAlignment = Element.ALIGN_TOP;
            const int defaultFontSize = 6;

            var leftWordsCell = pdfProvider.CreateCell(
                @"场地介绍：TMG艺术中心位于星汇两江艺术商业中心七区，是以现场顶级音乐空间为核心主题的复合式艺术中心，以打造全领域、全视听的音乐艺术互动体验及音乐主题商业为经营理念。中心拥有西南地区首座、国内单体面积最大，极具震撼视听的音乐LIVE剧场—TMG LIVE。同时，中心配置有1000平米的多功能厅，能满足各类会议、发布、演出、展览、宴会及节目录制等多功能专业需求。
            ", defaultColspan, 1, defaultVerticalAlignment, defaultHorizontalAlignment, defaultFontSize, 0);
            leftWordsCell.SetLeading(3, 1);
            leftWordsCell.Padding = -1;

            table.AddCell(leftWordsCell);
            table.AddCell(pdfProvider.CreateEmptyCell());

            var middleWordsCell = pdfProvider.CreateCell(
                $@"场地风格：艺术风格 工业风格 私密空间{Chunk.NEWLINE}推荐理由：超酷的大台阶，挑高9米的专业秀场，还有颇具年代感的小火车直达秀场门口，仪式感爆棚！{Chunk.NEWLINE}（以下为商场读取）{Chunk.NEWLINE}商场定位：轻奢，社区，艺术，年轻{Chunk.NEWLINE}客群定位：家庭，年轻人{Chunk.NEWLINE}商场内品牌：CK/BOSS/维密{Chunk.NEWLINE}
            ", defaultColspan, 1, defaultVerticalAlignment, defaultHorizontalAlignment, defaultFontSize, 0);

            table.AddCell(middleWordsCell);
            table.AddCell(pdfProvider.CreateEmptyCell());

            var rightWordsCell = pdfProvider.CreateCell(
                $@"城市：重庆市{Chunk.NEWLINE}行政区：渝北区{Chunk.NEWLINE} 地址：黄山大道中段6号星汇两江七区(两江幸福广场){Chunk.NEWLINE}商圈：五角场{Chunk.NEWLINE}距地铁里程：500m{Chunk.NEWLINE}离核心市区距离（KM）:50{Chunk.NEWLINE}周边写字楼租金（元/天/平）：12000{Chunk.NEWLINE}周边住宅售价(元/平) ：12000{Chunk.NEWLINE}
            ", defaultColspan, 1, defaultVerticalAlignment, defaultHorizontalAlignment, defaultFontSize, 0);

            table.AddCell(rightWordsCell);

            //保存
            pdfProvider.AddToDocument(table);
            //pdfProvider.Save();
        }

        #endregion 创建第二页

        #region 创建第三页

        public void CreatePageFor3()
        {
            var pdfProvider = CreateTemplate("TMG艺术中心-空间数据");

            var table = pdfProvider.CreateTable(2);

            PdfPCell cell = null;

            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "t2.png"));


            cell = new PdfPCell(GenerateTable()) { Rowspan = 2, Border = 0 };
            table.AddCell(cell);


            //需要把 另一个 cell 填充才能展示表格数据
            //图片需要设置始终复制
            var descriptionCell = CreatePdfCell("空间名称：多功能厅");
            descriptionCell.Border = 0;  // TODO:需要取消
            descriptionCell.Colspan = 1;
            table.AddCell(descriptionCell);

            pdfProvider.AddToDocument(table);
            //pdfProvider.Save();
        }

        private static PdfPTable GenerateTable()
        {
            var bfChinese = BaseFont.CreateFont("C://WINDOWS//Fonts//simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            var fontChinese = new iTextSharp.text.Font(bfChinese, 8, iTextSharp.text.Font.NORMAL, new iTextSharp.text.BaseColor(0, 0, 0));

            var cell = new PdfPCell(new Phrase("基础信息", fontChinese)) { Colspan = 18, BackgroundColor = new BaseColor(208, 208, 208) };
            var table = new PdfPTable(19);
            cell.VerticalAlignment = Element.ALIGN_MIDDLE;
            cell.HorizontalAlignment = Element.ALIGN_CENTER;

            var emptyCell = CreatePdfCell("");
            emptyCell.Rowspan = 20;
            emptyCell.Colspan = 1;
            emptyCell.Border = 0;
            table.AddCell(emptyCell);

            table.AddCell(cell);

            table.AddCell(CreatePdfCell("可使用面积（平米）"));
            table.AddCell(CreatePdfCell("750"));

            table.AddCell(CreatePdfCell("长*宽(米）"));
            table.AddCell(CreatePdfCell("50*50"));

            table.AddCell(CreatePdfCell("所处楼层"));
            table.AddCell(CreatePdfCell("1F"));

            table.AddCell(CreatePdfCell("空间层高"));
            table.AddCell(CreatePdfCell("12-16米"));

            table.AddCell(CreatePdfCell("可搭建层高"));
            table.AddCell(CreatePdfCell("7-8米"));

            table.AddCell(CreatePdfCell("可容纳人数（人）"));
            table.AddCell(CreatePdfCell("500"));

            table.AddCell(CreatePdfCell("可否进车"));
            table.AddCell(CreatePdfCell("是"));

            table.AddCell(CreatePdfCell("平日人流量（商场类型读取）"));
            table.AddCell(CreatePdfCell("30000"));

            table.AddCell(CreatePdfCell("周末人流量 （商场类型读取）"));
            table.AddCell(CreatePdfCell("50000"));

            table.AddCell(CreatePdfCell("配套设施（非商场类读取）"));
            table.AddCell(CreatePdfCell("卫生间，化妆间，休息室，VIP室，空调暖气，网络WIFI，停车泊位"));

            var price1Cell = CreatePdfCell("周一~周四价格");
            price1Cell.Rowspan = 2;

            table.AddCell(price1Cell);
            table.AddCell(CreatePdfCell("活动 4万元/天"));
            table.AddCell(CreatePdfCell("搭建 2万元/天"));

            var price2Cell = CreatePdfCell("周五~周日价格");
            price2Cell.Rowspan = 2;

            table.AddCell(price1Cell);
            table.AddCell(CreatePdfCell("活动 4万元/天"));
            table.AddCell(CreatePdfCell("搭建 2万元/天"));

            return table;
        }

        public static PdfPCell CreatePdfCell(string content)
        {
            var bfChinese = BaseFont.CreateFont("C://WINDOWS//Fonts//simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            var fontChinese = new iTextSharp.text.Font(bfChinese, 6, iTextSharp.text.Font.NORMAL, new iTextSharp.text.BaseColor(0, 0, 0));

            var cell = new PdfPCell(new Phrase(content, fontChinese))
            {
                VerticalAlignment = Element.ALIGN_MIDDLE,
                HorizontalAlignment = Element.ALIGN_CENTER,
                Colspan = 9
            };

            return cell;
        }

        #endregion 创建第三页

        #region 创建第四页

        /// <summary>
        /// 创建第四页
        /// </summary>
        public void CreatePageFor4()
        {
            var pdfProvider = CreateTemplate("TMG艺术中心-空间数据");

            var table = new PdfPTable(2)
            {
                TotalWidth = 450,
                LockedWidth = true
            };

            var leftCell = new PdfPCell(iTextSharp.text.Image.GetInstance(_imgPrefix + "4/left.png"), true)
            {
                VerticalAlignment = Element.ALIGN_MIDDLE,
                Border = 0
            };
            table.AddCell(leftCell);

            var innerTable = new PdfPTable(19);

            //设定列后，其它 cell 也需要设置占用列
            innerTable.AddCell(pdfProvider.CreateEmptyCell(1, 20));
            innerTable.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "4/right.png", 18));

            //将一个 table 包裹在 cell 中，设置边框为 0，可以隐藏边框
            table.AddCell(new PdfPCell(innerTable) { Border = 0 });

            var descriptionCell = pdfProvider.CreateCell("空间名称：多功能厅(读取第二张空间照片) ");
            descriptionCell.Border = 0;
            descriptionCell.Colspan = 1;
            descriptionCell.PaddingTop = -40;

            table.AddCell(descriptionCell);
            table.AddCell(pdfProvider.CreateEmptyCell());

            pdfProvider.AddToDocument(table);
        }

        #endregion 创建第四页

        #region 创建第五页

        public void CreatePageFor5()
        {
            const int defaultColspan = 20;

            var pdfProvider = CreateTemplate("TMG艺术中心-空间活动案例1");

            const int numColumns = 62;
            var table = pdfProvider.CreateTable(numColumns);

            table.AddCell(pdfProvider.CreateBlankSpaceCell(numColumns));

            table.AddCell(pdfProvider.CreateCell($@"活动名称：保时捷极致体验全国巡演", 62, 1, Element.ALIGN_LEFT, Element.ALIGN_LEFT, 8, 0));

            table.AddCell(pdfProvider.CreateCell($@"活动时间：2017年6月", 62, 1, Element.ALIGN_LEFT, Element.ALIGN_LEFT, 8, 0));

            table.AddCell(pdfProvider.CreateBlankSpaceCell(numColumns));
            table.AddCell(pdfProvider.CreateBlankSpaceCell(numColumns));

            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "5/t1.png", defaultColspan));
            table.AddCell(pdfProvider.CreateEmptyCell());
            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "5/t2.png", defaultColspan));
            table.AddCell(pdfProvider.CreateEmptyCell());
            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "5/t3.png", defaultColspan));

            pdfProvider.AddToDocument(table);
        }

        #endregion 创建第五页

        #region 创建第六页

        public void CreatePageFor6()
        {
            const int defaultColspan = 20;

            var pdfProvider = CreateTemplate("TMG艺术中心-空间活动案例2");

            const int numColumns = 62;
            var table = pdfProvider.CreateTable(numColumns);

            table.AddCell(pdfProvider.CreateBlankSpaceCell(numColumns));

            table.AddCell(pdfProvider.CreateCell($@"活动名称：宝马极致体验全国巡演", 62, 1, Element.ALIGN_LEFT, Element.ALIGN_LEFT, 8, 0));

            table.AddCell(pdfProvider.CreateCell($@"活动时间：2017年7月", 62, 1, Element.ALIGN_LEFT, Element.ALIGN_LEFT, 8, 0));

            table.AddCell(pdfProvider.CreateBlankSpaceCell(numColumns));
            table.AddCell(pdfProvider.CreateBlankSpaceCell(numColumns));

            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "5/t1.png", defaultColspan));
            table.AddCell(pdfProvider.CreateEmptyCell());
            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "5/t2.png", defaultColspan));
            table.AddCell(pdfProvider.CreateEmptyCell());
            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "5/t3.png", defaultColspan));

            pdfProvider.AddToDocument(table);

        }

        #endregion 创建第六页

        #region 创建第七页

        public void CreatePageFor7()
        {
            const int defaultColspan = 20;

            var pdfProvider = CreateTemplate("TMG艺术中心-相关图片");


            const int numColumns = 62;
            var table = pdfProvider.CreateTable(numColumns);

            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "7/t1.png", defaultColspan));
            table.AddCell(pdfProvider.CreateEmptyCell());
            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "7/t2.png", defaultColspan));
            table.AddCell(pdfProvider.CreateEmptyCell());
            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "7/t3.png", defaultColspan));

            //第 2 行
            table.AddCell(pdfProvider.CreateCell("秀场序厅", defaultColspan, 1, 5, 1, 6, 0));
            table.AddCell(pdfProvider.CreateEmptyCell());
            table.AddCell(pdfProvider.CreateCell("休息室", defaultColspan, 1, 5, 1, 6, 0));
            table.AddCell(pdfProvider.CreateEmptyCell());
            table.AddCell(pdfProvider.CreateCell("室外周边", defaultColspan, 1, 5, 1, 6, 0));

            //空行
            // table.AddCell(pdfProvider.CreateBlankSpaceCell(numColumns));

            //第 3 行
            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "7/t1.png", defaultColspan));
            table.AddCell(pdfProvider.CreateEmptyCell());
            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "7/t2.png", defaultColspan));
            table.AddCell(pdfProvider.CreateEmptyCell());
            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "7/t3.png", defaultColspan));

            //第 4 行
            table.AddCell(pdfProvider.CreateCell("入口处", defaultColspan, 1, 5, 1, 6, 0));
            table.AddCell(pdfProvider.CreateEmptyCell());
            table.AddCell(pdfProvider.CreateCell("VIP室", defaultColspan, 1, 5, 1, 6, 0));
            table.AddCell(pdfProvider.CreateEmptyCell());
            table.AddCell(pdfProvider.CreateCell("空间外景", defaultColspan, 1, 5, 1, 6, 0));

            //table.AddCell(pdfProvider.CreateBlankSpaceCell(numColumns));

            //table.AddCell(pdfProvider.CreateCell($@"活动名称：宝马极致体验全国巡演", 62, 1, Element.ALIGN_LEFT, Element.ALIGN_LEFT, 8, 0));

            //table.AddCell(pdfProvider.CreateCell($@"活动时间：2017年7月", 62, 1, Element.ALIGN_LEFT, Element.ALIGN_LEFT, 8, 0));

            //table.AddCell(pdfProvider.CreateBlankSpaceCell(numColumns));
            //table.AddCell(pdfProvider.CreateBlankSpaceCell(numColumns));

            //table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "5/t1.png", defaultColspan));
            //table.AddCell(pdfProvider.CreateEmptyCell());
            //table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "5/t2.png", defaultColspan));
            //table.AddCell(pdfProvider.CreateEmptyCell());
            //table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "5/t3.png", defaultColspan));

            pdfProvider.AddToDocument(table);

        }

        #endregion 创建第七页

        #region 创建第八页

        public void CreatePageFor8()
        {
            var pdfProvider = CreateTemplate("TMG艺术中心-空间补充数据");

            var table = pdfProvider.CreateTable(2);

            table.AddCell(pdfProvider.CreateImgCell(_imgPrefix + "8/t2.png"));

            var cell = new PdfPCell(GenerateTable8()) { Rowspan = 2, Border = 0 };
            table.AddCell(cell);

            //需要把 另一个 cell 填充才能展示表格数据
            //图片需要设置始终复制
            var descriptionCell = CreatePdfCell("空间名称：多功能厅（读取第3张空间照片）");
            descriptionCell.Border = 0;  // TODO:需要取消
            descriptionCell.Colspan = 1;
            table.AddCell(descriptionCell);

            pdfProvider.AddToDocument(table);
        }

        private static PdfPTable GenerateTable8()
        {
            var bfChinese = BaseFont.CreateFont("C://WINDOWS//Fonts//simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            var fontChinese = new iTextSharp.text.Font(bfChinese, 6, iTextSharp.text.Font.NORMAL, new iTextSharp.text.BaseColor(0, 0, 0));

            var cell = new PdfPCell(new Phrase("补充信息", fontChinese)) { Colspan = 18, BackgroundColor = new BaseColor(208, 208, 208) };
            var table = new PdfPTable(19);
            cell.VerticalAlignment = Element.ALIGN_MIDDLE;
            cell.HorizontalAlignment = Element.ALIGN_CENTER;

            var emptyCell = CreatePdfCell("");
            emptyCell.Rowspan = 20;
            emptyCell.Colspan = 1;
            emptyCell.Border = 0;
            table.AddCell(emptyCell);

            table.AddCell(cell);

            table.AddCell(CreatePdfCell("可使用面积（平米）"));
            table.AddCell(CreatePdfCell("200"));

            table.AddCell(CreatePdfCell("空间吊点承重(KG/个)"));
            table.AddCell(CreatePdfCell("200"));

            table.AddCell(CreatePdfCell("吊点数 （个）"));
            table.AddCell(CreatePdfCell("8"));

            table.AddCell(CreatePdfCell("最大吊点总承重数（KG）"));
            table.AddCell(CreatePdfCell("500"));

            table.AddCell(CreatePdfCell("固定座位数（个）"));
            table.AddCell(CreatePdfCell("200"));

            table.AddCell(CreatePdfCell("是否可以通宵搭建"));
            table.AddCell(CreatePdfCell("是"));

            table.AddCell(CreatePdfCell("通宵搭建价格&时间"));
            table.AddCell(CreatePdfCell("8000元/22:00-次日8:00"));

            table.AddCell(CreatePdfCell("可进场时间"));
            table.AddCell(CreatePdfCell("0:00-24:00"));

            table.AddCell(CreatePdfCell("可搭建时间"));
            table.AddCell(CreatePdfCell("0:00-24:00"));

            table.AddCell(CreatePdfCell("能耗说明（电费）"));
            table.AddCell(CreatePdfCell("2元/度"));

            table.AddCell(CreatePdfCell("能耗说明（水费）"));
            table.AddCell(CreatePdfCell("2元/立方"));

            table.AddCell(CreatePdfCell("供电量(千瓦)"));
            table.AddCell(CreatePdfCell("1000"));

            table.AddCell(CreatePdfCell("配电箱"));
            table.AddCell(CreatePdfCell("3*80A*4"));

            table.AddCell(CreatePdfCell("保洁费用"));
            table.AddCell(CreatePdfCell("2000元/场"));

            table.AddCell(CreatePdfCell("安保费用"));
            table.AddCell(CreatePdfCell("300元/人/8小时"));

            table.AddCell(CreatePdfCell("报批预估费用"));
            table.AddCell(CreatePdfCell("3000元"));

            table.AddCell(CreatePdfCell("报批预估时间"));
            table.AddCell(CreatePdfCell("30天"));

            table.AddCell(CreatePdfCell("其他费用"));
            table.AddCell(CreatePdfCell("设备进场费5000元（大型电力设备）"));

            table.AddCell(CreatePdfCell("活动现场禁忌"));
            table.AddCell(CreatePdfCell("禁止房产类活动，亲子类活动，餐饮类油烟活动，地面必须保护覆盖"));

            return table;
        }

        #endregion 创建第八页

        /// <summary>
        /// 保存
        /// </summary>
        public void Save()
        {
            _pdfProvider.Save();
        }

        /// <summary>
        /// 添加新页面
        /// </summary>
        public void AddNewPage()
        {
            _pdfProvider.Document.NewPage();
        }



        #region private  methods


        /// <summary>
        /// 创建模板
        /// </summary>
        /// <param name="header">头部文字</param>
        /// <returns></returns>
        private PdfProvider CreateTemplate(string header)
        {
            _pdfProvider.Draw(_imgPrefix + "footer.png", 0, 0, 500, 25);
            _pdfProvider.Draw(_imgPrefix + "bar.png", 0, 275, 15, 15);
            _pdfProvider.DrawContent(header, 12, 0, 0, 255, 20, 278);

            return _pdfProvider;
        }

        #endregion private  methods
    }
}
